package lq2097;

//lq2097，通过60%
/*
输入数据：
5 1
1 0 1 0

对应输出：
4
 */
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	//去程H数组
	static int[] h;
	//河宽
	static int n;
	//天数
	static int x;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		x = sc.nextInt();
		//n-1个石头，下标从1开始记录
		h = new int[n];
		for(int i=1;i<=n-1;i++) {
			h[i] = sc.nextInt();
		}
		
		//整数二分模板
		int l=1,r=n;
		while(l<=r){
			//向右位移一位相当于除以2
			//位移效率比除以2高，可以多过一个用例
			int mid = (l+r) >> 1;
		    if(check(mid)) 
		    	r = mid - 1;
		    else 
		    	l = mid + 1;
		}

	    System.out.println(l);
		
	}
	
	//mid表示跳跃能力
	static boolean check(int mid) {
		//跳跃能力大于河宽
		if(mid>=n)
			return true;
		//深拷贝
		int[] tmp = Arrays.copyOf(h, h.length);

		//当前位置
		int pos;
		
		//x次的往返
		for(int k=1;k<=x;k++){
			
			//去程
			pos = 0;
			while(pos<n) {
				int head = pos;
				//根据跳跃距离，反向找个能落脚的最远石头
				for(int i=pos+mid;i>pos;i--) {
					//到岸
					if(i>=n) {
						pos = n;
						break;
					}
					
					//找到可落脚的最远石头
					if(tmp[i]>0) {
						pos = i;
						tmp[i]--;
						break;
					}				
				}
				//没找到落脚石
				if(pos==head) {
					return false;
				}
			}
			
			//回程
			pos=n;
			while(pos>0) {
				int head=pos;
				//根据跳跃距离，反向找个能落脚的最远石头
				for(int i=pos-mid;i<pos;i++) {
					//上岸
					if(i<=0) {
						pos = -1;
						break;
					}
					
					//找到可落脚的最远石头
					if(tmp[i]>0) {
						pos = i;
						tmp[i]--;
						break;
					}
				}
				
				//没找到落脚石
				if(pos==head) {
					return false;
				}
				
			}
				
	    }	
		
		return true;
	}
	
}
